package licode.unisop.provider.api;

import licode.unisop.provider.info.*;
import licode.unisop.provider.vo.*;

import java.util.List;

/**
 * 定义平台信息实现接口
 *
 * @author licode
 */
public interface SiPlatformProvider {
    /**
     * 平台数据提供者名称（唯一）
     * @return 名称
     */
    String getName();

    /**
     * 保持平台信息
     * @param platform 平台信息
     */
    void addPlatform(SiPlatform platform);
    void updatePlatform(SiPlatform platform);
    void updatePlatformRealm(SiPlatRealmUpdateIn platform);

    /**
     * 授权平台给指定用户
     * @param item 授权信息
     */
    void grantPlatform(SiAuthPlatToUserIn item);

    /**
     * 根据平台ID查询平台信息
     * @param findInfo 平台ID信息
     * @return 平台信息
     */
    SiPlatform findPlatform(SiPlatIdFind findInfo);

    /**
     * 分页查找平台信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiPlatform> findPlatformPage(PlatPageInfo req);

    /**
     * 分页查找授权的平台信息
     * @param req 请求信息
     * @return 授权平台信息
     */
    SiPageResult<String> findAuthPlatformPage(AuthPlatPageInfo req);

    //--------------------------------- 资源接口

    /**
     * 根据操作类型完成对资源的处理
     * @param assetIn 资源和操作类型
     */
    void addAsset(SiSaveAssetIn assetIn);
    void updateAsset(SiSaveAssetIn assetIn);

    /**
     * 删除资源
     * @param delInfo 资源ＩＤ信息
     */
    void removeAsset(SiAssetDel delInfo);

    /**
     * 获取用户、角色、客户等资源信息
     * @param idFind 领域和资源ID
     * @return 用户资源
     */
    SiAssetEntry lookupAsset(SiAssetId idFind);

    /**
     * 根据资源ID查询资源基本信息
     * @param lookupIn 查询信息
     * @return 资源信息
     */
    SiAssetBrief lookupAssetBrief(SiAssetLookupIn lookupIn);

    /**
     * 根据资源编码查询资源
     * @param lookupIn 查询信息
     * @return 资源信息
     */
    SiAssetBrief lookupAsseByCode(SiLookupAssetByCodeIn lookupIn);

    /**
     * 获取资源子资源条数（对于具有层次结构的资源）
     *
     * @return 资源子资源条数
     */
    Long getSubAssetCount(SiAssetLookupIn lookupIn);

    /**
     * 查询资源子资源ID的集合
     * @param idFind 资源ID信息
     * @return 子资源ID集合
     */
    List<String> findAssetSubTreeIds(SiAssetId idFind);

    /**
     * 找到资源关联的所有资源信息
     * @param idInfo 资源查询条件
     * @return 关联资源
     */
    List<SiAssetKey> findAssetKeys(SiAssetId idInfo);

    /**
     * 获取平台资源信息
     * @param plInfo 平台ID查询条件
     * @return 平台资源信息
     */
    SiAssetInfo getPlatAsset(SiPlatIdFind plInfo);
    SiAssetInfo getAuthPlatAsset(SiPlatIdFind plInfo);

    /**
     * 查找资源信息
     * @param req 查找条件
     * @return 资源信息
     */
    List<SiAssetBrief> findAssetList(AssetListInfo req);

    /**
     * 分页查找资源信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiAssetBrief> findAssetPage(AssetPageInfo req);

    /**
     * 找到资源关联的所有资源信息
     * @param idInfo 资源查询条件
     * @return 关联资源
     */
    SiPageResult<SiAssetKey> findAssetKeysPage(SiAssetIdPage idInfo);

    //--------------------------------- 关联资源接口

    /**
     * 移除关联资源
     * @param delInfo 删除消息
     */
    void removeRelAsset(SiRemoveRelAsset delInfo);
    void removeAllRelAsset(SiRemoveAllRelAsset req);

    void saveHoldAssets(SiSaveHoldAssets info);
    void saveAssetHolds(SiSaveAssetHolds info);

    /**
     * 分页查找关联的目标资源信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiAssetRelation> findHoldRefAssetPage(HoldAssetPageInfo req);

    /**
     * 分页查找关联的宿主资源信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiAssetRelation> findAssetRefHoldPage(AssetHoldPageInfo req);

    /**
     * 分页查找关联的目标资源信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiAssetBrief> findHoldAssetPage(HoldAssetPageInfo req);

    /**
     * 分页查找关联的宿主资源信息
     * @param req 查找条件
     * @return 用户信息
     */
    SiPageResult<SiAssetBrief> findAssetHoldPage(AssetHoldPageInfo req);
}
